package com.example.archive.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.archive.entity.Training;
import com.example.archive.mapper.TrainingMapper;
import com.example.archive.service.TrainingService;
import com.example.archive.service.SystemLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 培训资料服务实现类
 * 继承MyBatis Plus的ServiceImpl，实现TrainingService接口
 * 提供培训资料相关的业务逻辑实现
 */
@Service
public class TrainingServiceImpl extends ServiceImpl<TrainingMapper, Training> implements TrainingService {
    
    /**
     * 系统日志服务，用于记录操作日志
     */
    @Autowired
    private SystemLogService systemLogService;
    
    /**
     * 获取已发布的培训资料列表
     * 调用Mapper的自定义查询方法，关联查询上传者信息
     * 
     * @return 已发布的培训资料列表
     */
    @Override
    public List<Training> getPublishedTrainings() {
        return baseMapper.selectPublishedTrainings();
    }
    
    /**
     * 分页查询培训资料（带上传人信息）
     * 调用Mapper的自定义分页查询方法
     * 
     * @param current 当前页码
     * @param size 每页大小
     * @return 分页查询结果
     */
    @Override
    public Page<Training> getTrainingsWithUploader(int current, int size) {
        Page<Training> page = new Page<>(current, size);
        return baseMapper.selectTrainingsWithUploader(page);
    }
    
    /**
     * 上传培训资料
     * 设置上传时间，如果没有指定状态则默认为published
     * 保存成功后记录系统日志
     * 
     * @param training 培训资料对象
     * @return 上传是否成功
     */
    @Override
    public boolean uploadTraining(Training training) {
        // 设置上传时间为当前时间
        training.setUploadTime(LocalDateTime.now());
        // 如果没有设置状态，默认为published
        if (training.getStatus() == null || training.getStatus().isEmpty()) {
            training.setStatus("published");
        }
        // 保存到数据库
        boolean result = save(training);
        
        // 保存成功后记录操作日志
        if (result) {
            String action = "published".equals(training.getStatus()) ? "上传培训资料" : "提交培训资料";
            systemLogService.recordLog(training.getUploaderId(), action, 
                action + "：" + training.getTitle());
        }
        
        return result;
    }
    
    /**
     * 审核培训资料
     * 根据培训资料ID更新状态，并记录审核日志
     * 
     * @param trainingId 培训资料ID
     * @param status 审核后的状态（published/rejected）
     * @return 审核是否成功
     */
    @Override
    public boolean approveTraining(Integer trainingId, String status) {
        // 根据ID获取培训资料
        Training training = getById(trainingId);
        if (training != null) {
            // 更新状态
            training.setStatus(status);
            boolean result = updateById(training);
            
            // 更新成功后记录审核日志
            if (result) {
                systemLogService.recordLog(null, "审核培训资料", 
                    "审核培训资料：" + training.getTitle() + "，状态：" + status);
            }
            
            return result;
        }
        return false;
    }
} 